package com.kayb.patterns.structural;

/**
 * 适配器模式，为了消除类、接口之间不匹配的兼容性问题，一般有：
 * 1、类适配，创建一个继承Source类的新类Adapter，重写目标方法即可
 * 2、对象适配，创建一个持有Source类实例的Wrapper类，在新方法中调用实例的相关方法即可
 * 3、接口适配，创建一个抽象类Wrapper，实现Source类接口的所有方法，新类继承抽象类即可
 * @author huangkaibin
 * @date 2018-08-28
 **/
public class Adapter {

    // 1、类适配
    static class Source1 {
        public void process() {
            System.out.println("Source1");
        }
    }
    interface Service {
        void handle();
    }
    static class Adapter1 extends Source1 implements Service {
        @Override
        public void process() {
            System.out.println("Adapter1");
        }
        @Override
        public void handle() {
            process();
        }
    }

    // 2、对象适配
    static class Adapter2 implements Service {
        private Source1 source1;

        public Adapter2(Source1 source1) {
            this.source1 = source1;
        }

        @Override
        public void handle() {
            this.source1.process();
        }
    }

    // 3、接口适配
    static abstract class AbstractAdapter3 implements Service {

    }
    static class Adapter3 implements Service {
        @Override
        public void handle() {
            System.out.println("Adapter3");
        }
    }

    private Service service;

    public Adapter(Service service) {
        this.service = service;
    }

    public void handle() {
        service.handle();
    }

    public static void main(String[] args) {
        Adapter adapter = new Adapter(new Adapter1());
        adapter.handle();
    }

}
